package com.choudou5.solr.util;

import cn.hutool.core.date.DateTime;
import com.choudou5.solr.util.bean.DateRange;

import java.util.Date;

/**
 * @Name：时间工具类
 * @@author choudou5
 * @@date 2018-07-21
 */
public class DateUtil extends cn.hutool.core.date.DateUtil {

    public static String timeToDateStr(long time) {
        return new DateTime(time).toString();
    }

    public static final String DATE_FORMAT_SOLR = "yyyy-MM-dd'T'HH:mm:ss'Z'";

    /**
     * 将过去的时间转为为，刚刚，xx秒，xx分钟，xx小时前、xx天前，大于3天的显示日期
     */
    public static String formatTimeAgo(Date dateTime) {
        if(dateTime == null){
            return "";
        }
        String interval = null;
        // 得出的时间间隔是毫秒
        long time = System.currentTimeMillis() - dateTime.getTime();
        // 如果时间间隔小于10秒则显示“刚刚”time/10得出的时间间隔的单位是秒
        if (time / 1000 < 10 && time / 1000 >= 0) {
            interval = "刚刚";
        }
        // 如果时间间隔大于24小时则显示多少天前
        else if (time / 3600000 < 24*4 && time / 3600000 >= 24) {
            int d = (int) (time / (3600000*24));// 得出的时间间隔的单位是天
            interval = d + "天前";
        }
        // 如果时间间隔小于24小时则显示多少小时前
        else if (time / 3600000 < 24 && time / 3600000 >= 1) {
            int h = (int) (time / 3600000);// 得出的时间间隔的单位是小时
            interval = h + "小时前";
        }
        // 如果时间间隔小于60分钟则显示多少分钟前
        else if (time / 60000 < 60 && time / 60000 >=1) {
            int m = (int) ((time % 3600000) / 60000);// 得出的时间间隔的单位是分钟
            interval = m + "分钟前";
        }
        // 如果时间间隔小于60秒则显示多少秒前
        else if (time / 1000 < 60 && time / 1000 >=10) {
            int se = (int) ((time % 60000) / 1000);
            interval = se + "秒前";
        }
        // 大于3天的，则显示正常的时间，但是不显示秒
        else {
            interval = formatDate(dateTime);
        }
        return interval;
    }

    public static String toSolrDate(Date date){
       return format(date, DATE_FORMAT_SOLR);
    }

    public static Date formatToSolrDate(String dateStr){
        return parse(dateStr, DATE_FORMAT_SOLR);
    }


    /**
     * 该方法 至多 用到 2038年初， 不然会超过 int 最大值:2147483647
     * @return
     */
    public static int getIntMs(){
        return Long.valueOf(System.currentTimeMillis()/1000).intValue();
    }

    public static long getUnixTimeStamp(){
        return Long.valueOf(System.currentTimeMillis() / 1000);
    }

    public static DateTime lastYear() {
        return offsetMonth(new DateTime(), -12);
    }

    /**
     * 获取 统计范围日期
     * @param startTime
     * @return
     */
    public static DateRange getStatRangeDate(String startTime){
        Date startDate = DateUtil.lastWeek();
        if(StrUtil.isNotBlank(startTime)){
            startDate = DateUtil.parse(startTime);
        }
        DateRange range = new DateRange();
        Date endDate = DateUtil.date();
        long diff = DateUtil.betweenMs(startDate, endDate);
        long hour = 1000*60*60;
        long oneDay = hour*24;
        long add = 0;
        if(diff <= (oneDay*2)){ //2天内
            range.setFormat("HH");
            range.setSqlFormat("%m-%d %k");
            add = hour*2;
            range.setDiffDateType("2HOUR");
        }else if(diff <= (oneDay*15)){ //半个月
            range.setFormat("MM-dd");
            range.setSqlFormat("%m-%d");
            add = oneDay;
            range.setDiffDateType("1DAY");
        }else if(diff <= (oneDay*32)){ //一个月
            range.setFormat("MM-dd");
            range.setSqlFormat("%m-%d");
            add = oneDay*2;
            range.setDiffDateType("2DAY");
        }else if(diff > (oneDay*30*24)){ //大于24个月
            range.setFormat("yyyy-MM");
            range.setSqlFormat("%Y-%m");
            add = oneDay*30;
            range.setDiffDateType("1MONTH");
            startDate = DateUtil.offsetMonth(endDate, -12); //超过24个月，只从最近一年开始
        }else{
            range.setFormat("yyyy-MM");
            range.setSqlFormat("%Y-%m");
            add = oneDay*30;
            range.setDiffDateType("1MONTH");
        }
        range.setDiffMs(add);
        Date temp = startDate;
        while(temp.before(endDate)){
            range.addDate(temp);
            temp = DateUtil.offsetSecond(temp, Long.valueOf(add / 1000).intValue());
        }
        return range;
    }

    public static void main(String[] args) {
        DateRange range = getStatRangeDate(DateUtil.yesterday().toString());
        System.out.println(JsonUtil.toStr(range));
    }

}
